#include "per.hpp"

Per::Per(int octave,double persistance,double lambda,double amplitude):octave(octave),persistance(persistance),lambda(lambda),amplitude(amplitude)
{
	srand((unsigned int)time(NULL));
	for(int i=0;i<100*100;i++)
	{
		double v=(double)rand()/RAND_MAX;
		aleatoire.push_back(v);
	}
}

Per::~Per()
{
	aleatoire.clear();
}

double Per::interpolation(double a,double b,double l,double x)
{
	if (l==0)
	    return a;
	if (l==1)
	    return b;
	
	double c = x/l;
	
	double v1 = 3*pow(1-c, 2) - 2*pow(1-c,3);
	double v2 = 3*pow(c, 2)   - 2*pow(c, 3);
	
	return a*v1 + b*v2;
}

double Per::hauteur1octave(double x,double y,int numOctave)
{
	double l=lambda*pow(0.3,numOctave);
	double a=amplitude*pow(persistance,numOctave);
	
	int i1,i2,j1,j2;
	i1=(int)(x/l);
	i2=x-(i1*l);

	j1=(int)(y/l);
	j2=y-(j1*l);

	double v1=interpolation(aleatoire[(i1%100)*100+j1%100],aleatoire[((i1+1)%100)*100+j1%100],l,i2);
	double v2=interpolation(aleatoire[(i1%100)*100+(j1+1)%100],aleatoire[((i1+1)%100)*100+(j1+1)%100],l,i2);
	return a*interpolation(v1,v2,l,j2);
}

double Per::hauteur(double x,double y)
{
	double h=0;
	for(int i=0;i<octave;i++)
	{
		h+=hauteur1octave(x,y,i);
	}
	return h;
}